{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### trainer的官方api https://huggingface.co/docs/transformers/main_classes/trainer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 导入相关包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\numpy\\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:\n",
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\numpy\\.libs\\libopenblas.FB5AE2TYXYH2IJRDKGDGQ3XBKLKTF43H.gfortran-win_amd64.dll\n",
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll\n",
      "  warnings.warn(\"loaded more than 1 DLL from .libs:\"\n"
     ]
    }
   ],
   "source": [
    " # 导入trainer相关的包\n",
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification,TrainingArguments, Trainer\n",
    "from datasets import load_dataset\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 加载数据集合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = load_dataset('csv', data_files='D:/code/datasets/ChineseNlpCorpus/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv',split='train')\n",
    "dataset =  dataset.filter(lambda x: x['review'] is not None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatasetDict({\n",
       "    train: Dataset({\n",
       "        features: ['label', 'review'],\n",
       "        num_rows: 6988\n",
       "    })\n",
       "    test: Dataset({\n",
       "        features: ['label', 'review'],\n",
       "        num_rows: 777\n",
       "    })\n",
       "})"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datasets = dataset.train_test_split(test_size=0.1)\n",
    "datasets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建dataloader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8c3a60cae9794e60b170ba85b3e73c5a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/6988 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "781c03aa0f014f57843bbd961ca46e1f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/777 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "128"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "tokenizer = AutoTokenizer.from_pretrained('D:/code/models/huggingface/chinese-macbert-large')\n",
    "def process_function(examples):\n",
    "    tokenizer_examples = tokenizer(examples['review'], truncation=True, padding='max_length', max_length=128)\n",
    "    tokenizer_examples[\"labels\"] = examples['label']\n",
    "    return tokenizer_examples\n",
    "\n",
    "tokenizer_datasets = datasets.map(process_function, batched=True,remove_columns=datasets['train'].column_names)\n",
    "len(tokenizer_datasets['test']['input_ids'][0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# dataloader 处理不需要了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataset,eval_dataset  =  tokenizer_datasets['train'],tokenizer_datasets['test']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 不需要创建优化器，只需要创建模型即可"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at D:/code/models/huggingface/chinese-macbert-large and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
      "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
     ]
    }
   ],
   "source": [
    "model =  AutoModelForSequenceClassification.from_pretrained('D:/code/models/huggingface/chinese-macbert-large',num_labels=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估部分重写evaluate的部分\n",
    "#### 1、在huggingface.co 网站中找tasks 然后在看支持的评估指标\n",
    "#### 2、直接下载失败，可以github上下载源代码，然后直接加载文件夹。\n",
    "#### 3、使用 add_batch 和 最终的compute方法最后实现评估指标的汇总工作\n",
    "#### 4、可以画出雷达图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "path D:/code/evaluate-main/metrics/accuracy None DownloadMode.REUSE_DATASET_IF_EXISTS\n",
      "path D:/code/evaluate-main/metrics/f1 None DownloadMode.REUSE_DATASET_IF_EXISTS\n",
      "path D:/code/evaluate-main/metrics/precision None DownloadMode.REUSE_DATASET_IF_EXISTS\n",
      "path D:/code/evaluate-main/metrics/recall None DownloadMode.REUSE_DATASET_IF_EXISTS\n"
     ]
    }
   ],
   "source": [
    "import evaluate\n",
    "# 4 项目都加入\n",
    "acc_metric =  evaluate.load('D:/code/evaluate-main/metrics/accuracy')\n",
    "f1_metric =  evaluate.load('D:/code/evaluate-main/metrics/f1')\n",
    "precision_metric =  evaluate.load('D:/code/evaluate-main/metrics/precision')\n",
    "recall_metric =  evaluate.load('D:/code/evaluate-main/metrics/recall')\n",
    "\n",
    "# 写一个多种标准合成的评价函数\n",
    "def eval_metrics(eval_predict):\n",
    "    predictions,labels =  eval_predict\n",
    "    predictions = predictions.argmax(axis=-1)\n",
    "    combine_acc = acc_metric.compute(predictions=predictions, references=labels)\n",
    "    f1 = f1_metric.compute(predictions=predictions, references=labels)\n",
    "    precision = precision_metric.compute(predictions=predictions, references=labels)\n",
    "    recall = recall_metric.compute(predictions=predictions, references=labels)\n",
    "    combine_acc.update(f1)\n",
    "    combine_acc.update(precision)\n",
    "    combine_acc.update(recall)\n",
    "    return combine_acc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练和验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_model():\n",
    "    model.eval()\n",
    "    with torch.inference_mode():\n",
    "        for batch in val_loader:\n",
    "            if torch.cuda.is_available():\n",
    "                batch = {k:v.cuda() for k,v in batch.items()}\n",
    "            output = model(**batch)\n",
    "            pred =  torch.argmax(output.logits,dim=-1)\n",
    "            # 预测batch的结果\n",
    "            clf_metrics.add_batch(predictions=pred.long(),references=batch['labels'].long())\n",
    "    # 最终拼接计算\n",
    "    return clf_metrics.compute()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建 TrainingArguments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\transformers\\training_args.py:1525: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "TrainingArguments(\n",
       "_n_gpu=1,\n",
       "accelerator_config={'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None, 'use_configured_state': False},\n",
       "adafactor=False,\n",
       "adam_beta1=0.9,\n",
       "adam_beta2=0.999,\n",
       "adam_epsilon=1e-08,\n",
       "auto_find_batch_size=False,\n",
       "batch_eval_metrics=False,\n",
       "bf16=False,\n",
       "bf16_full_eval=False,\n",
       "data_seed=None,\n",
       "dataloader_drop_last=False,\n",
       "dataloader_num_workers=0,\n",
       "dataloader_persistent_workers=False,\n",
       "dataloader_pin_memory=True,\n",
       "dataloader_prefetch_factor=2,\n",
       "ddp_backend=None,\n",
       "ddp_broadcast_buffers=None,\n",
       "ddp_bucket_cap_mb=None,\n",
       "ddp_find_unused_parameters=None,\n",
       "ddp_timeout=1800,\n",
       "debug=[],\n",
       "deepspeed=None,\n",
       "disable_tqdm=False,\n",
       "dispatch_batches=None,\n",
       "do_eval=True,\n",
       "do_predict=False,\n",
       "do_train=False,\n",
       "eval_accumulation_steps=None,\n",
       "eval_delay=0,\n",
       "eval_do_concat_batches=True,\n",
       "eval_on_start=False,\n",
       "eval_steps=None,\n",
       "eval_strategy=epoch,\n",
       "eval_use_gather_object=False,\n",
       "evaluation_strategy=epoch,\n",
       "fp16=False,\n",
       "fp16_backend=auto,\n",
       "fp16_full_eval=False,\n",
       "fp16_opt_level=O1,\n",
       "fsdp=[],\n",
       "fsdp_config={'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False},\n",
       "fsdp_min_num_params=0,\n",
       "fsdp_transformer_layer_cls_to_wrap=None,\n",
       "full_determinism=False,\n",
       "gradient_accumulation_steps=32,\n",
       "gradient_checkpointing=True,\n",
       "gradient_checkpointing_kwargs=None,\n",
       "greater_is_better=True,\n",
       "group_by_length=False,\n",
       "half_precision_backend=auto,\n",
       "hub_always_push=False,\n",
       "hub_model_id=None,\n",
       "hub_private_repo=False,\n",
       "hub_strategy=every_save,\n",
       "hub_token=<HUB_TOKEN>,\n",
       "ignore_data_skip=False,\n",
       "include_inputs_for_metrics=False,\n",
       "include_num_input_tokens_seen=False,\n",
       "include_tokens_per_second=False,\n",
       "jit_mode_eval=False,\n",
       "label_names=None,\n",
       "label_smoothing_factor=0.0,\n",
       "learning_rate=4e-05,\n",
       "length_column_name=length,\n",
       "load_best_model_at_end=True,\n",
       "local_rank=0,\n",
       "log_level=passive,\n",
       "log_level_replica=warning,\n",
       "log_on_each_node=True,\n",
       "logging_dir=D:/code/logs/trainer/checkpoints\\runs\\Aug13_21-25-15_WIN-20240216IDH,\n",
       "logging_first_step=False,\n",
       "logging_nan_inf_filter=True,\n",
       "logging_steps=150,\n",
       "logging_strategy=steps,\n",
       "lr_scheduler_kwargs={},\n",
       "lr_scheduler_type=linear,\n",
       "max_grad_norm=1.0,\n",
       "max_steps=-1,\n",
       "metric_for_best_model=f1,\n",
       "mp_parameters=,\n",
       "neftune_noise_alpha=None,\n",
       "no_cuda=False,\n",
       "num_train_epochs=5,\n",
       "optim=adafactor,\n",
       "optim_args=None,\n",
       "optim_target_modules=None,\n",
       "output_dir=D:/code/logs/trainer/checkpoints,\n",
       "overwrite_output_dir=False,\n",
       "past_index=-1,\n",
       "per_device_eval_batch_size=32,\n",
       "per_device_train_batch_size=2,\n",
       "prediction_loss_only=False,\n",
       "push_to_hub=False,\n",
       "push_to_hub_model_id=None,\n",
       "push_to_hub_organization=None,\n",
       "push_to_hub_token=<PUSH_TO_HUB_TOKEN>,\n",
       "ray_scope=last,\n",
       "remove_unused_columns=True,\n",
       "report_to=['tensorboard'],\n",
       "restore_callback_states_from_checkpoint=False,\n",
       "resume_from_checkpoint=None,\n",
       "run_name=D:/code/logs/trainer/checkpoints,\n",
       "save_on_each_node=False,\n",
       "save_only_model=False,\n",
       "save_safetensors=True,\n",
       "save_steps=500,\n",
       "save_strategy=epoch,\n",
       "save_total_limit=3,\n",
       "seed=42,\n",
       "skip_memory_metrics=True,\n",
       "split_batches=None,\n",
       "tf32=None,\n",
       "torch_compile=False,\n",
       "torch_compile_backend=None,\n",
       "torch_compile_mode=None,\n",
       "torch_empty_cache_steps=None,\n",
       "torchdynamo=None,\n",
       "tpu_metrics_debug=False,\n",
       "tpu_num_cores=None,\n",
       "use_cpu=False,\n",
       "use_ipex=False,\n",
       "use_legacy_prediction_loop=False,\n",
       "use_mps_device=False,\n",
       "warmup_ratio=0.0,\n",
       "warmup_steps=0,\n",
       "weight_decay=0.01,\n",
       ")"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_args =  TrainingArguments(\n",
    "    output_dir='D:/code/logs/trainer/checkpoints', # 训练模型的输出路径\n",
    "    per_device_train_batch_size=2, # 训练集 batch size\n",
    "    gradient_accumulation_steps=32 , # 梯度累积，梯度在多少步之后更新一次参数，节省显存\n",
    "    gradient_checkpointing=True, # 梯度检查点，减少显存占用，但训练速度会变慢\n",
    "    optim='adafactor', # 优化器,\n",
    "    \n",
    "    num_train_epochs=5, # 训练的 epochs 数\n",
    "\n",
    "    per_device_eval_batch_size=32, # 验证集 batch size\n",
    "    # eval_steps=150,\n",
    "    logging_steps=150, # 每 150 个 batch 记录一次日志\n",
    "\n",
    "    # save_steps=100, # 每 100 个 batch 保存一次模型 和每个epoch 保存一次模型互斥\n",
    "    save_strategy = 'epoch', # 每 1 个 epoch 保存一次模型\n",
    "    save_total_limit=3, # 保存 1 个模型\n",
    "    \n",
    "    evaluation_strategy='epoch', # 每 1 个 epoch 验证一次模型\n",
    "\n",
    "    learning_rate=4e-5, # 学习率\n",
    "    weight_decay=0.01, # 权重衰减\n",
    "\n",
    "    metric_for_best_model='f1',\n",
    "    load_best_model_at_end=True, # 加载最优模型\n",
    "    report_to='tensorboard', # 训练日志保存到 tensorboard\n",
    "    )\n",
    "train_args"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建  Trainer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import DataCollatorWithPadding\n",
    "\n",
    "trainer = Trainer(\n",
    "    model=model, # 指定模型\n",
    "    args=train_args, # 执行训练参数\n",
    "    train_dataset=train_dataset, # 训练数据集指定 切分后的数据集\n",
    "    eval_dataset=eval_dataset, # 验证数据集指定\n",
    "    data_collator=DataCollatorWithPadding(tokenizer=tokenizer), # 数据集的预处理对数据集进行padding操作\n",
    "    compute_metrics = eval_metrics, # tokenizer\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f163d40c4c6a4a12a69cc20e6560d33c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/545 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "397754b449464050a8b4c6fa310602f0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/25 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'eval_loss': 0.2338416427373886, 'eval_accuracy': 0.9047619047619048, 'eval_f1': 0.926, 'eval_precision': 0.9526748971193416, 'eval_recall': 0.9007782101167315, 'eval_runtime': 9.1156, 'eval_samples_per_second': 85.239, 'eval_steps_per_second': 2.743, 'epoch': 1.0}\n"
     ]
    }
   ],
   "source": [
    "trainer.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "afad551ccb004c4ba83e0aae77fe623d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/7 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3f99d53cd872405e868eb0ddab08210a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/7 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'eval_loss': 0.24565087258815765,\n",
       " 'eval_accuracy': 0.9073359073359073,\n",
       " 'eval_f1': 0.933579335793358,\n",
       " 'eval_precision': 0.933579335793358,\n",
       " 'eval_recall': 0.933579335793358,\n",
       " 'eval_runtime': 0.7032,\n",
       " 'eval_samples_per_second': 1104.88,\n",
       " 'eval_steps_per_second': 9.954,\n",
       " 'epoch': 3.0}"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.evaluate()\n",
    "trainer.evaluate(tokenizer_datasets['test'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "00ca3e2fe7a744bfa9a81f2d04891f7a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/7 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "PredictionOutput(predictions=array([[-2.4498055 ,  3.4582949 ],\n",
       "       [-2.3407195 ,  3.0549386 ],\n",
       "       [-2.0071414 ,  3.1888256 ],\n",
       "       ...,\n",
       "       [-2.4244976 ,  2.9080567 ],\n",
       "       [-0.13412291, -0.13832486],\n",
       "       [ 1.9788047 , -2.5659158 ]], dtype=float32), label_ids=array([1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,\n",
       "       1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1,\n",
       "       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,\n",
       "       1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1,\n",
       "       1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1,\n",
       "       0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,\n",
       "       1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1,\n",
       "       0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1,\n",
       "       1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,\n",
       "       1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,\n",
       "       1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0,\n",
       "       1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1,\n",
       "       1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1,\n",
       "       1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,\n",
       "       0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1,\n",
       "       1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,\n",
       "       0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1,\n",
       "       1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,\n",
       "       0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1,\n",
       "       1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1,\n",
       "       1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,\n",
       "       1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0,\n",
       "       1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,\n",
       "       1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1,\n",
       "       0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,\n",
       "       0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,\n",
       "       0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1,\n",
       "       1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0,\n",
       "       1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1,\n",
       "       1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0,\n",
       "       0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0,\n",
       "       1, 1, 0, 0, 1, 1, 0], dtype=int64), metrics={'test_loss': 0.24565087258815765, 'test_accuracy': 0.9073359073359073, 'test_f1': 0.933579335793358, 'test_precision': 0.933579335793358, 'test_recall': 0.933579335793358, 'test_runtime': 0.6922, 'test_samples_per_second': 1122.519, 'test_steps_per_second': 10.113})"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.predict(tokenizer_datasets['test'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 保存模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# def save_model(model,tokenizer,epoch):\n",
    "#     original_path = \"D:/code/models/classfication_rbt3/\"\n",
    "#     path = os.path.join(original_path,'epoch_{}'.format(epoch))\n",
    "#     if not os.path.exists(path):\n",
    "#         os.makedirs(path)\n",
    "#     model.save_pretrained(path)\n",
    "#     tokenizer.save_pretrained(path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# def train(epoch=5,log_step=100):\n",
    "#     global_step = 0\n",
    "#     for epoch in range(epoch):\n",
    "#         print('epoch:{}'.format(epoch))\n",
    "#         model.train()\n",
    "#         for batch in train_loader:\n",
    "#             if torch.cuda.is_available():\n",
    "#                 batch = {k:v.cuda() for k,v in batch.items()}\n",
    "#             optimizer.zero_grad()\n",
    "#             output = model(**batch)\n",
    "#             output.loss.backward()\n",
    "#             optimizer.step()\n",
    "#             if global_step % log_step == 0:\n",
    "#                 print('epoch:{},step:{},loss:{}'.format(epoch,global_step,output.loss.item()))\n",
    "#             global_step+=1  \n",
    "#         acc = evaluate_model()\n",
    "#         print('epoch:{},acc:{}'.format(epoch,acc))\n",
    "#         save_model(model,tokenizer,epoch)\n",
    "#     return acc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# acc = train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(type(acc),acc.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估结果的可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "239d38e79e194d0cbbf6b2cd8e7f3ca3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/7 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'eval_loss': 0.24565087258815765, 'eval_accuracy': 0.9073359073359073, 'eval_f1': 0.933579335793358, 'eval_precision': 0.933579335793358, 'eval_recall': 0.933579335793358, 'eval_runtime': 0.7053, 'eval_samples_per_second': 1101.658, 'eval_steps_per_second': 9.925, 'epoch': 3.0}\n"
     ]
    }
   ],
   "source": [
    "from evaluate.visualization import radar_plot\n",
    "\n",
    "test_out =  trainer.evaluate(tokenizer_datasets['test'])\n",
    "print(test_out)\n",
    "\n",
    "radar_out = [{\n",
    "        \"accuracy\": test_out['eval_accuracy'],\n",
    "        \"f1\":  test_out['eval_f1'],\n",
    "        \"precision\":  test_out['eval_precision'],\n",
    "        \"recall\":  test_out['eval_recall']\n",
    "}]\n",
    "\n",
    "model_names = [\n",
    "    \"model 1\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\evaluate\\visualization.py:47: UserWarning: Attempting to set identical low and high ylims makes transformation singular; automatically expanding.\n",
      "  ax.set_ylim(*ranges[j])\n",
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\evaluate\\visualization.py:56: UserWarning: Attempting to set identical low and high ylims makes transformation singular; automatically expanding.\n",
      "  ax.set_ylim(*ranges[j])\n",
      "d:\\Miniconda\\envs\\geo\\lib\\site-packages\\evaluate\\visualization.py:124: RuntimeWarning: invalid value encountered in double_scalars\n",
      "  sdata.append((d - y1) / (y2 - y1) * (x2 - x1) + x1)\n",
      "C:\\Users\\Administrator\\AppData\\Local\\Temp\\ipykernel_278912\\3299056528.py:2: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  plot.show()\n"
     ]
    },
    {
     "data": {
      "image/png": "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IiIialQsrUQGaOnSpZDJZIiJiUFFRQW6d++OvXv3ol+/fjWOs7KywqFDhzBv3jxs3rwZP/74I1q1aoU+ffqoN0qSyWTYsWMHPvzwQ6xbtw6///477O3tER4ejg4dOqhv66uvvoJcLse3334LU1NTjBo1CgsXLvzXDZOqGRsbY+vWrZg5cyY+/vhjmJmZYdiwYZgxYwYCAwNrHBsYGIiEhAS88847WL58OSoqKuDm5oZRo0Y9dLuDBw9Gs2bNoFQqER0dXddvJRERERE1Monq7/PliIgMSFVVFZydnTF48GB8//33ouMQERER0d9wTSsRGbQtW7bg7t27NTZ3IiIiIiLtwZFWIjJIx48fR3JyMt5//320aNECSUlJoiMRERER0SNwpJWIDNLy5cvx4osvolWrVvjpp59ExyEiIiKix+BIKxEREREREWktjrQSERERERGR1mJpJSIiIiIiIq3F0kpERERERERai6WViIiIiIiItBZLKxEREREREWktllYiIiIiIiLSWiytREREREREpLWMRAcgIv2kUChQUlKC4uLiGv9WVVVBqVSq35KTkwEAHTt2hFQqVb8ZGRnBysoK1tbWNf6VyWSC7xkRERERNSWWViL6VwqFAnfu3EF2drb67datW+r3c3NzHyqo5eXl6utbWFioS6exsXGNclpdWjt06ACVSqUus3K5XH1bZWVl6tsyNzd/qMi2aNECTk5OcHJygrOzs/p9JycntGrVikWXiIiISIdJVCqVSnQIIhJLqVTi1q1buHTpkvotPT0dWVlZyM7Oxu3bt6FUKtG8efOHSqGTkxNatmxZo0g++L6lpeU/lka5XI4dO3YgKioKxsbGjzxGoVCgtLS0Ril+8P27d+/WKNTVpTovLw9SqRQODg5wcnKCi4sLvLy84OPjo35zcXGBRCJprG8tERERETUQR1qJDEhRURHOnz9fo5xeunQJly9fRkVFBdzd3dVlrm/fvmjdurW6mDo6OsLU1FRIbplMBhsbG9jY2NTpevfv30dOTo66yN68eRPp6en4448/cOnSJVy9ehVmZmbw9vauUWR9fHzg5+dX569HRERERJrHkVYiPVVYWIikpCQkJiYiMTERSUlJuHz5Mlq1agVfX9+HSlrbtm2FlNLajLQ2lvv37+PKlSu4fPlyjRKflpaGO3fuwNvbG6GhoQgNDUVISAhC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IiIiIkE40kqNKisrCxEREbhy5QpOnTrFwkpEtRIWFoaTJ08iPT0dERERuHXrluhIREREJAhLKzWaEydOoFOnTvD390d8fDwcHR1FRyIiHeLk5IS4uDi0b98eYWFhOHHihOhIREREJABLKzWKtWvXolevXnj99dexevVqmJqaio5ERDrIzMwMP/zwA+bMmYNevXph7dq1oiMRERFRE+OaVtIohUKBt956C6tWrcKmTZvQr18/0ZGISMdJJBLMmjULfn5+GD16NM6dO4ePPvoIMplMdDQiIiJqAiytpDFlZWUYPXo0Ll26hOPHj8PHx0d0JCLSI/3798fx48cRHR2NixcvYv369bCwsBAdi4iIiBoZpweTRuTl5aFv374oKCjAsWPHWFiJqFH4+voiISEBeXl5eOqpp5CXlyc6EhERETUyllZqsBs3bqBHjx5o2bIldu3ahWbNmomORER6rFmzZti9ezfs7e3Ro0cP3Lx5U3QkIiIiakQsrdQg58+fR7du3dC9e3ds3LgR5ubmoiMRkQEwNzfH77//jm7duqFbt264cOGC6EhERETUSFhaqd6OHTuG8PBwTJo0CStWrICREZdIE1HTMTIywsqVKzFhwgSEh4fj2LFjoiMRERFRI2DLoHrZtm0bRo8ejU8//RTTp08XHYeIDJREIsH7778PBwcH9O3bF7/88gsGDhwoOhYRERFpEEdaqc7WrFmDZ555Bj/88AMLKxFphRkzZmD16tUYNWoUfvzxR9FxiIiISIM40kp1snjxYrz33nvYunUrevfuLToOEZHaqFGj0KJFCwwbNgz37t3DrFmzREciIiIiDWBppVr75JNPsHDhQuzfvx+hoaGi4xARPaR3797Yv38/+vbtC7lcjjfffFN0JCIiImogllaqlffffx9ffvkl9u/fj8DAQNFxiIgeKzQ0FPv378eTTz4JuVyOt99+W3QkIiIiagCWVvpHKpUK8+fPx/Lly7F//3506NBBdCQion8VFBSEuLg49OnTB1VVVZg3bx4kEonoWERERFQPLK30j+bPn48VK1YgPj4efn5+ouMQEdVahw4d1MVVpVJhwYIFoiMRERFRPbC00mO99957+PbbbxEXF8fCSkQ6yd/fH/v370dkZCSMjIzwzjvviI5EREREdcTSSo/08ccf46uvvmJhJSKd5+fnpy6uxsbGmDt3ruhI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",
      "text/plain": [
       "<Figure size 640x480 with 5 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot =  radar_plot(data=radar_out,model_names=model_names)\n",
    "plot.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
